package com.dc.juc.example._2_sync;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Description: synchronized 修饰 当前类 和 静态方法，锁的是类
 * @author: gdc
 * @date: 2021/7/28
 * @version 1.0
 */
@Slf4j
public class Synchronized2 {

    /**
     * 当前使用了两个对象，而锁也是锁在类上，
     * 所以：
     *  结果是正常打印，但是需要先执行完获取到类锁的线程，才会执行执行其他的线程
     */
    public static void main(String[] args){
        Synchronized2 sync1 = new Synchronized2();
        Synchronized2 sync2 = new Synchronized2();

        ExecutorService threadPool = Executors.newCachedThreadPool();
        threadPool.execute(() -> sync1.test1(0));
        threadPool.execute(() -> sync2.test2(0));
        threadPool.shutdown();
    }


    /**
     * 打印信息 从 1 - 10
     *  synchronized (Synchronized2.class) : 修饰的是类，锁的是类
     */
    public void test1(int num) {
        synchronized (Synchronized2.class) {
            for (int i = 1; i <= 10; i++) {
                log.info("test1 {}", ++num);
            }
        }
    }

    /**
     * 打印信息 从 1 - 10
     *  synchronized : 修饰的是静态方法，锁的是类
     */
    public static synchronized void test2(int num) {
        for (int i = 1; i <= 10; i++) {
            log.info("test2 {}", ++num);
        }
    }
}
